#ifndef HTTP_REQUEST_HPP_
#define HTTP_REQUEST_HPP_

#include "Common.hpp"
//#include "timer.hpp"
#include <map>

using std::map;
using std::string;

class Timer;

class HTTP_Request{
private:
    int client_fd;
    int epoll_fd;

    int request_len;           // 消息长度
    char buffer[BUF_SIZE];     // 存放用户请求的消息

    /* Request Line 内容 */
    int request_method;        // 请求类型
    char *URL_begin;           // 统一资源定位符
    char *URL_end;
    int protocol_version; // 协议版本号

    /* 解析时所用的状态及指针 */
    int parse_state;
    char *preBlankPos;
    char *curPos;

    /* HTTP Response */
    bool keep_alive;        // 是否为长连接
    bool modified;          // 连接是否修改
    int status_code;        // 返回的状态码
    string content_type;       // 返回的文件的类型

    Timer *timer;

    void parse_request_line();
    void parse_request_head();
    void parse_request_body();
    void parse_url(string& filename);

    void init_response();
    void construct_response(string& filename);
    const char* get_short_message();

public:
    
    HTTP_Request(){}
    HTTP_Request(int _client_fd, int _epoll_fd) :                   \
        client_fd(_client_fd), epoll_fd(_epoll_fd),                 \
        request_len(0), keep_alive(false)                            \
    {
        bzero(buffer, BUF_SIZE);
    }

    int HTTP_Reccive_Request();
    void HTTP_Parse_Request();
    int get_client_fd() { return client_fd; }
    void set_timer_node(Timer* _t){
        timer = _t;
    }
    Timer* get_timer_node(){
        return timer;
    }
    bool get_alive(){
        return keep_alive;
    }
    void close_connection(){
        close(client_fd);
    }
    void clear_buffer(){
        bzero(buffer, BUF_SIZE);
    }
};

#endif